package com.zh.file;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.jsoup.internal.StringUtil;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @Description:
 * @ClassName TestClass
 * @date: 2020.12.17 11:40
 * @Author: zhanghang
 */
public class TestClass {
    public static void main(String[] args) throws InterruptedException, IllegalAccessException, InstantiationException {
        String str = "";
        System.out.println(StrUtil.isEmpty(str));
        Date date = new Date();
        String da = "yyyy年MM月dd日 HH时mm分ss秒";
        System.out.println(DateUtil.format(date, da));

        String userId = null;
        if(StrUtil.isBlank(userId)){
            System.out.println("=========");
        }
        //        Class<ABC> clazz = ABC.class;
//        // 获取该类所有方法
//        Method[] methods = clazz.getMethods();
//        // 获取类的所有公开属性
//        Field[] fields = clazz.getFields();
//        for (Method method : methods) {
//            System.out.println(method.getName());
//        }
//        for (Field field : fields) {
//            System.out.println(field);
//        }
//        // 获取所有的属性包括室友属性
//        Field[] declaredFields = clazz.getDeclaredFields();
//        for (Field field : declaredFields) {
//            System.out.println(field);
//        }
//
//        Method[] declaredMethods = clazz.getDeclaredMethods();
//        for (Method method : declaredMethods) {
//            System.out.println(method.getName());
//        }
//        Class<? super ABC> superclass = clazz.getSuperclass();
//        System.out.println(superclass.getName());
//        ABC abc = clazz.newInstance();
//        abc.setId("123");
//        Class<CBA> cbaClass = CBA.class;
//        CBA cba = cbaClass.newInstance();
//        System.out.println(cba.hello());
//        try {
//            Object obj = superclass.newInstance();
//            CBA cba = (CBA) obj;
//            System.out.println(cba.hello());
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//        }
    }

//    @Data
//    class ABC extends CBA{
//        private String id;
//        private String name;
//    }

    @Data
    class CBA{
        private String age;
        private String password;
        public String hello(){
            return "hello";
        }
        public CBA(){}
    }


    /**
     * description: 当天0点时间 ，获得当天0点时间
     * date: 2020年-12月-22日 13:45
     * author: zhanghang
     * 
     * @param 
     * @return java.util.Date
     */ 
    public static Date getTimesmorning() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();


    }
    /**
     * description: 昨天0点时间 ， 获得昨天0点时间
     * date: 2020年-12月-22日 13:45
     * author: zhanghang
     *
     * @param
     * @return java.util.Date
     */
    public static Date getYesterdaymorning() {
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(getTimesmorning().getTime()-3600*24*1000);
        return cal.getTime();
    }
    /**
     * description: 近7天时间 ，获得当天近7天时间
     * date: 2020年-12月-22日 13:45
     * author: zhanghang
     *
     * @param
     * @return java.util.Date
     */
    public static Date getWeekFromNow() {
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis( getTimesmorning().getTime()-3600*24*1000*7);
        return cal.getTime();
    }

    // 获得当天24点时间
    public static Date getTimesnight() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 24);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }

    /**
     * description: 本周周一0点时间 ，获得本周一0点时间
     * date: 2020年-12月-22日 13:45
     * author: zhanghang
     *
     * @param
     * @return java.util.Date
     */
    public static Date getTimesWeekmorning() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        return cal.getTime();
    }

    /**
     * description: 本周周日24点时间 ，获得本周日24点时间
     * date: 2020年-12月-22日 13:44
     * author: zhanghang
     * 
     * @param 
     * @return java.util.Date
     */ 
    public static Date getTimesWeeknight() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getTimesWeekmorning());
        cal.add(Calendar.DAY_OF_WEEK, 7);
        return cal.getTime();
    }

    /**
     * description: 本月初0点时间 ，获得本月第一天0点时间
     * date: 2020年-12月-22日 13:44
     * author: zhanghang
     * 
     * @param 
     * @return java.util.Date
     */ 
    public static Date getTimesMonthmorning() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
        return cal.getTime();
    }

    /**
     * description: 本月未24点时间 ，获得本月最后一天24点时间
     * date: 2020年-12月-22日 13:44
     * author: zhanghang
     *
     * @param
     * @return java.util.Date
     */
    public static Date getTimesMonthnight() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
        cal.set(Calendar.HOUR_OF_DAY, 24);
        return cal.getTime();
    }

    /**
     * description: 上月初0点时间
     * date: 2020年-12月-22日 13:44
     * author: zhanghang
     * 
     * @param 
     * @return java.util.Date
     */ 
    public static Date getLastMonthStartMorning() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getTimesMonthmorning());
        cal.add(Calendar.MONTH, -1);
        return cal.getTime();
    }

    /**
     * description: 本季度开始点时间 
     * date: 2020年-12月-22日 13:43
     * author: zhanghang
     * 
     * @param 
     * @return java.util.Date
     */ 
    public static Date getCurrentQuarterStartTime() {
        Calendar c = Calendar.getInstance();
        int currentMonth = c.get(Calendar.MONTH) + 1;
        SimpleDateFormat longSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat shortSdf = new SimpleDateFormat("yyyy-MM-dd");
        Date now = null;
        try {
            if (currentMonth >= 1 && currentMonth <= 3)
                c.set(Calendar.MONTH, 0);
            else if (currentMonth >= 4 && currentMonth <= 6)
                c.set(Calendar.MONTH, 3);
            else if (currentMonth >= 7 && currentMonth <= 9)
                c.set(Calendar.MONTH, 4);
            else if (currentMonth >= 10 && currentMonth <= 12)
                c.set(Calendar.MONTH, 9);
            c.set(Calendar.DATE, 1);
            now = longSdf.parse(shortSdf.format(c.getTime()) + " 00:00:00");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return now;
    }

    /**
     * description: 本季度结束点时间 
     * date: 2020年-12月-22日 13:43
     * author: zhanghang
     * 
     * @param 
     * @return java.util.Date
     */ 
    public static Date getCurrentQuarterEndTime() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getCurrentQuarterStartTime());
        cal.add(Calendar.MONTH, 3);
        return cal.getTime();
    }

    /**
     * description: 本年开始点时间
     * date: 2020年-12月-22日 13:43
     * author: zhanghang
     *
     * @param
     * @return java.util.Date
     */
    public static Date getCurrentYearStartTime() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.YEAR));
        return cal.getTime();
    }

    /**
     * description: 本年结束点时间
     * date: 2020年-12月-22日 13:43
     * author: zhanghang
     * 
     * @param 
     * @return java.util.Date
     */ 
    public static Date getCurrentYearEndTime() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getCurrentYearStartTime());
        cal.add(Calendar.YEAR, 1);
        return cal.getTime();
    }

    /**
     * description: 上年开始点时间
     * date: 2020年-12月-22日 13:43
     * author: zhanghang
     *
     * @param
     * @return java.util.Date
     */
    public static Date getLastYearStartTime() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getCurrentYearStartTime());
        cal.add(Calendar.YEAR, -1);
        return cal.getTime();
    }
}
